<?php
#### FUNCTIONS #################################################################
function html() { return library('html'); }

#### HTML LIBRARY ##############################################################
class HTMLLibrary {
	
	private $tags;
	
	// Tags with automatic separate closing tags
	private $autoend = array('th', 'td', 'b', 'i', 'p', 'strong', 'div', 'span', 
		'label', 'option', 'a', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6');
	
	// Tags with automatic self closing
	private $closed = array('img', 'input');
	
	// Ignore if attribute value is empty
	private $ignore = array('id', 'value'); 
	
	// Define primary attributes for tags
	private $primary = array('img' => 'src');
	
	#### CALL ##################################################################
	public function __call($method, $params) {
		if (in_array($method, $this->autoend)) {
			$return = html()->tag($method);
			if ($params) html()->tags[] = $params[0];
			html()->tag('/'.$method);
			return $return;
		} else {
			if ($params) {
				if (array_key_exists($method, $this->primary)) 
					$attribute = $this->primary[$method];
				else $attribute = 'id';
				if (in_array($method, $this->closed)) 
					return html()->tag($method)->$attribute($params[0])
						->close(null);
				else
					return html()->tag($method)->$attribute($params[0]);
			}
			else return html()->tag($method);			
		}
	}
	
	#### TAG ###################################################################
	public function tag($tag) {
		$object  = new HTMLAttribute();
		return html()->tags[][$tag] = $object;
	}
	
	#### INSERT ################################################################
	public function insert($html) {
		html()->tags[] = $html;
		return $this;
	}
	
	#### CLOSE #################################################################
	public function close($tag) {
		return html()->tag('/'.$tag);
	}
	
	#### BR ####################################################################
	public function br($bool = null) {
		if ($bool !== false) html()->tag('br');
		return $this;
	}	
	
	#### BUILD TAG #############################################################
	public function buildTag($tag) {
		if (is_array($tag)) {
			$keys = array_keys($tag);
			$attributes = null;
			$close = null;
			foreach (get_object_vars($tag[$keys[0]]) as $key => $value) {
				if ($key == 'close') $close = ' /';
				else if ($value) $attributes .= ' '.$key.'="'.$value.'"';
				else if (!in_array($key, $this->ignore)) $attributes .= ' '.$key;
			}
			return '<'.$keys[0].$attributes.$close.'>';
		} else return $tag;		
	}
	
	#### RENDER ################################################################
	public function render() {
		$tags = null;
		foreach ($this->tags as $tag) {
			$tags .= $this->buildTag($tag);
		}
		unset($this->tags);
		return $tags;
	}
	
	#### DRAW ##################################################################
	public function draw() { echo $this->render(); }
}

#### HMTL ATTRIBUTE ############################################################
class HTMLAttribute {
	public function __call($method, $params) {
		$this->$method = (isset($params[0]) ? $params[0] : null); 
		return $this; 
	}
	
	public function br() { return html()->br(); } 
	public function draw() { return html()->draw(); } 
	public function render() { return html()->render(); } 
	public function attribute($name, $value = false) { return $this->$name = $value; } 
}
?>
